﻿Option Strict On

Imports DbDataLib
Imports KUeLib.Buchungen
Imports System.Data.Common
Imports KUeLib.Data.ServiceDefinitions
Imports KUeLib.Data


Namespace Services

    Public Class BuchungenDataSerivce
        Inherits KUeLib.Data.ServiceDefinitions.BuchungenDataSerivce

        Private Const TAB_BUCHUNGEN As String = "buchungen"

        Public Sub New(ByVal dataService As DbDataService)
            MyBase.New(dataService)
        End Sub

        Protected Function GetLastInsertId() As Integer
            Dim cmd As DbCommand = _dataService.Factory.CreateCommand()
            Dim sb As New Text.StringBuilder

            sb.AppendLine("SELECT last_insert_id()")

            cmd.CommandText = sb.ToString()

            Return CInt(_dataService.ExecuteScalar(cmd))
        End Function


        Public Overrides Function GetBuchungById(ByVal buchungId As Integer) As Buchung
            Dim b As Buchung = Nothing
            Dim cmd As DbCommand = _dataService.Factory.CreateCommand()
            Dim dt As DataTable

            cmd.CommandText = String.Format("SELECT * FROM {0} WHERE b_id = @p_id", TAB_BUCHUNGEN)
            cmd.Parameters.Add(_dataService.CreateParameter("p_id", DbType.Int32, buchungId))

            dt = _dataService.GetDataTable(cmd)

            For i As Integer = 0 To dt.Rows.Count - 1 Step 1
                b = New Buchung
                b.Buchungsdatum = CDate(Utils.DbNull2Nothing(dt.Rows(i)!b_buchungsdatum))
                b.Wertstellungsdatum = CDate(Utils.DbNull2Nothing(dt.Rows(i)!b_wertstellungsdatum))
                b.Id = CInt(Utils.DbNull2Nothing(dt.Rows(i)!b_id))
                b.Betrag = CDbl(Utils.DbNull2Nothing(dt.Rows(i)!b_betrag))
                b.Kontostand = CDbl(Utils.DbNull2Nothing(dt.Rows(i)!b_kontostand))
                b.Konto = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_konto))
                b.Beguenstigter = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_beguenstigter))
                b.Buchungstext = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_buchungstext))
                b.Status = CStr(Utils.DbNull2Nothing(dt.Rows(0)!b_status))
                b.Verwendungszweck(0) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz1))
                b.Verwendungszweck(1) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz2))
                b.Verwendungszweck(2) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz3))
                b.Verwendungszweck(3) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz4))
                b.Verwendungszweck(4) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz5))
                b.Verwendungszweck(5) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz6))
                b.Verwendungszweck(6) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz7))
                b.Verwendungszweck(7) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz8))
                b.Verwendungszweck(8) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz9))
                b.Verwendungszweck(9) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz10))
                b.Verwendungszweck(10) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz11))
                b.Verwendungszweck(11) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz12))
                b.Verwendungszweck(12) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz13))
                b.Verwendungszweck(13) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz14))
                b.KategorieId = CInt(Utils.DbNull2Nothing(dt.Rows(i)!b_kategorie))
                b.VertragId = CInt(Utils.DbNull2Nothing(dt.Rows(i)!b_vertrag))
                b.Bemerkung = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_bemerkung))
                b.ImportFile = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_importfile))
            Next

            Return b
        End Function

        Public Overrides Sub UpdateBuchung(ByVal b As Buchung)
            Dim cmdb As DbCommandBuilder = _dataService.Factory.CreateCommandBuilder()
            Dim dt As New DataTable
            cmdb.DataAdapter = _dataService.Factory.CreateDataAdapter()
            cmdb.DataAdapter.SelectCommand = _dataService.Factory.CreateCommand()
            cmdb.DataAdapter.SelectCommand.Connection = _dataService.Connection
            cmdb.DataAdapter.SelectCommand.CommandText = "SELECT * FROM buchungen WHERE b_id = @p_id"
            cmdb.DataAdapter.SelectCommand.Parameters.Add(_dataService.CreateParameter("p_id", DbType.Int32, b.Id))
            cmdb.DataAdapter.Fill(dt)

            cmdb.DataAdapter.InsertCommand = cmdb.GetUpdateCommand()

            If dt.Rows.Count = 1 Then

                dt.Rows(0)!b_buchungsdatum = b.Buchungsdatum
                dt.Rows(0)!b_wertstellungsdatum = b.Wertstellungsdatum
                dt.Rows(0)!b_betrag = b.Betrag
                dt.Rows(0)!b_kontostand = b.Kontostand
                dt.Rows(0)!b_konto = b.Konto
                dt.Rows(0)!b_beguenstigter = b.Beguenstigter
                dt.Rows(0)!b_bemerkung = b.Bemerkung
                dt.Rows(0)!b_status = b.Status
                dt.Rows(0)!b_vwz1 = b.Verwendungszweck(0)
                dt.Rows(0)!b_vwz2 = b.Verwendungszweck(1)
                dt.Rows(0)!b_vwz3 = b.Verwendungszweck(2)
                dt.Rows(0)!b_vwz4 = b.Verwendungszweck(3)
                dt.Rows(0)!b_vwz5 = b.Verwendungszweck(4)
                dt.Rows(0)!b_vwz6 = b.Verwendungszweck(5)
                dt.Rows(0)!b_vwz7 = b.Verwendungszweck(6)
                dt.Rows(0)!b_vwz8 = b.Verwendungszweck(7)
                dt.Rows(0)!b_vwz9 = b.Verwendungszweck(8)
                dt.Rows(0)!b_vwz10 = b.Verwendungszweck(9)
                dt.Rows(0)!b_vwz11 = b.Verwendungszweck(10)
                dt.Rows(0)!b_vwz12 = b.Verwendungszweck(11)
                dt.Rows(0)!b_vwz13 = b.Verwendungszweck(12)
                dt.Rows(0)!b_vwz14 = b.Verwendungszweck(14)
                dt.Rows(0)!b_kategorie = b.KategorieId
                dt.Rows(0)!b_vertrag = b.VertragId
                dt.Rows(0)!b_importfile = b.ImportFile

                cmdb.DataAdapter.Update(dt)

            End If

        End Sub

        Public Overrides Function InsertBuchung(ByVal b As Buchung) As Buchung
            Dim cmdb As DbCommandBuilder = _dataService.Factory.CreateCommandBuilder()
            Dim dt As New DataTable
            cmdb.DataAdapter = _dataService.Factory.CreateDataAdapter()
            cmdb.DataAdapter.SelectCommand = _dataService.Factory.CreateCommand()
            cmdb.DataAdapter.SelectCommand.Connection = _dataService.Connection
            cmdb.DataAdapter.SelectCommand.CommandText = "SELECT * FROM buchungen"
            cmdb.DataAdapter.FillSchema(dt, SchemaType.Mapped)

            cmdb.DataAdapter.InsertCommand = cmdb.GetInsertCommand()

            Dim r As DataRow = dt.NewRow()
            r!b_buchungsdatum = b.Buchungsdatum
            r!b_wertstellungsdatum = b.Wertstellungsdatum
            r!b_betrag = b.Betrag
            r!b_kontostand = b.Kontostand
            r!b_konto = b.Konto
            r!b_beguenstigter = b.Beguenstigter
            r!b_buchungstext = b.Buchungstext
            r!b_bemerkung = b.Bemerkung
            r!b_status = b.Status
            r!b_vwz1 = b.Verwendungszweck(0)
            r!b_vwz2 = b.Verwendungszweck(1)
            r!b_vwz3 = b.Verwendungszweck(2)
            r!b_vwz4 = b.Verwendungszweck(3)
            r!b_vwz5 = b.Verwendungszweck(4)
            r!b_vwz6 = b.Verwendungszweck(5)
            r!b_vwz7 = b.Verwendungszweck(6)
            r!b_vwz8 = b.Verwendungszweck(7)
            r!b_vwz9 = b.Verwendungszweck(8)
            r!b_vwz10 = b.Verwendungszweck(9)
            r!b_vwz11 = b.Verwendungszweck(10)
            r!b_vwz12 = b.Verwendungszweck(11)
            r!b_vwz13 = b.Verwendungszweck(12)
            r!b_vwz14 = b.Verwendungszweck(14)
            r!b_kategorie = b.KategorieId
            r!b_vertrag = b.VertragId
            r!b_importfile = b.ImportFile
            dt.Rows.Add(r)

            cmdb.DataAdapter.Update(dt)

            b.Id = GetLastInsertId()

            Return b
        End Function

        Public Overrides Function GetAnzahlBuchungen() As Integer
            Dim cmd As DbCommand = _dataService.Factory.CreateCommand()
            cmd.CommandText = "SELECT count(*) FROM buchungen"
            Return CInt(_dataService.ExecuteScalar(cmd))
        End Function

        Public Overrides Function BuchungExists(ByVal b As Buchung) As Boolean

            Dim value As Boolean = False
            Dim cmd As DbCommand = _dataService.Factory.CreateCommand()
            Dim sb As New Text.StringBuilder

            sb.AppendLine("SELECT count(*) FROM buchungen ")
            sb.AppendLine("WHERE b_betrag = @p_betrag ")
            sb.AppendLine("  AND b_kontostand = @p_kontostand ")
            sb.AppendLine("  AND b_wertstellungsdatum = @p_wertstellungsdatum ")
            sb.AppendLine("  AND b_buchungsdatum = @p_buchungsdatum ")
            sb.AppendLine("  AND b_buchungstext = @p_buchungstext ")

            cmd.CommandText = sb.ToString()

            cmd.Parameters.Add(_dataService.CreateParameter("p_betrag", DbType.Double, b.Betrag))
            cmd.Parameters.Add(_dataService.CreateParameter("p_kontostand", DbType.Double, b.Kontostand))
            cmd.Parameters.Add(_dataService.CreateParameter("p_wertstellungsdatum", DbType.Date, b.Wertstellungsdatum))
            cmd.Parameters.Add(_dataService.CreateParameter("p_buchungsdatum", DbType.Date, b.Buchungsdatum))
            cmd.Parameters.Add(_dataService.CreateParameter("p_buchungstext", DbType.String, b.Buchungstext))

            value = (CInt(_dataService.ExecuteScalar(cmd)) > 0)

            Return value

        End Function

        Public Overrides Function GetAlleBuchungen() As List(Of Buchung)
            Dim lob As New List(Of Buchung)
            Dim cmd As DbCommand = _dataService.Factory.CreateCommand()
            Dim dt As DataTable

            cmd.CommandText = String.Format("SELECT * FROM {0}", TAB_BUCHUNGEN)

            dt = _dataService.GetDataTable(cmd)

            For i As Integer = 0 To dt.Rows.Count - 1 Step 1
                Dim tempB As New Buchung
                tempB.Buchungsdatum = CDate(Utils.DbNull2Nothing(dt.Rows(i)!b_buchungsdatum))
                tempB.Wertstellungsdatum = CDate(Utils.DbNull2Nothing(dt.Rows(i)!b_wertstellungsdatum))
                tempB.Id = CInt(Utils.DbNull2Nothing(dt.Rows(i)!b_id))
                tempB.Betrag = CDbl(Utils.DbNull2Nothing(dt.Rows(i)!b_betrag))
                tempB.Kontostand = CDbl(Utils.DbNull2Nothing(dt.Rows(i)!b_kontostand))
                tempB.Konto = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_konto))
                tempB.Beguenstigter = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_beguenstigter))
                tempB.Buchungstext = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_buchungstext))
                tempB.Status = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_status))
                tempB.Verwendungszweck(0) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz1))
                tempB.Verwendungszweck(1) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz2))
                tempB.Verwendungszweck(2) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz3))
                tempB.Verwendungszweck(3) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz4))
                tempB.Verwendungszweck(4) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz5))
                tempB.Verwendungszweck(5) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz6))
                tempB.Verwendungszweck(6) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz7))
                tempB.Verwendungszweck(7) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz8))
                tempB.Verwendungszweck(8) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz9))
                tempB.Verwendungszweck(9) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz10))
                tempB.Verwendungszweck(10) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz11))
                tempB.Verwendungszweck(11) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz12))
                tempB.Verwendungszweck(12) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz13))
                tempB.Verwendungszweck(13) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz14))
                tempB.KategorieId = CInt(Utils.DbNull2Nothing(dt.Rows(i)!b_kategorie))
                tempB.VertragId = CInt(Utils.DbNull2Nothing(dt.Rows(i)!b_vertrag))
                tempB.Bemerkung = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_bemerkung))
                tempB.ImportFile = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_importfile))
                lob.Add(tempB)
            Next

            Return lob

        End Function

        Public Overrides Function GetBuchungenLimit(ByVal startWith As Integer, ByVal count As Integer) As List(Of Buchung)
            Dim lob As New List(Of Buchung)
            Dim cmd As DbCommand = _dataService.Factory.CreateCommand()
            Dim dt As DataTable

            cmd.CommandText = String.Format("SELECT * FROM {0} LIMIT {1}, {2}", New Object() {TAB_BUCHUNGEN, startWith.ToString(), count.ToString()})

            dt = _dataService.GetDataTable(cmd)

            For i As Integer = 0 To dt.Rows.Count - 1 Step 1
                Dim tempB As New Buchung
                tempB.Buchungsdatum = CDate(Utils.DbNull2Nothing(dt.Rows(i)!b_buchungsdatum))
                tempB.Wertstellungsdatum = CDate(Utils.DbNull2Nothing(dt.Rows(i)!b_wertstellungsdatum))
                tempB.Id = CInt(Utils.DbNull2Nothing(dt.Rows(i)!b_id))
                tempB.Betrag = CDbl(Utils.DbNull2Nothing(dt.Rows(i)!b_betrag))
                tempB.Kontostand = CDbl(Utils.DbNull2Nothing(dt.Rows(i)!b_kontostand))
                tempB.Konto = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_konto))
                tempB.Beguenstigter = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_beguenstigter))
                tempB.Buchungstext = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_buchungstext))
                tempB.Status = CStr(Utils.DbNull2Nothing(dt.Rows(0)!b_status))
                tempB.Verwendungszweck(0) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz1))
                tempB.Verwendungszweck(1) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz2))
                tempB.Verwendungszweck(2) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz3))
                tempB.Verwendungszweck(3) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz4))
                tempB.Verwendungszweck(4) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz5))
                tempB.Verwendungszweck(5) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz6))
                tempB.Verwendungszweck(6) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz7))
                tempB.Verwendungszweck(7) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz8))
                tempB.Verwendungszweck(8) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz9))
                tempB.Verwendungszweck(9) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz10))
                tempB.Verwendungszweck(10) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz11))
                tempB.Verwendungszweck(11) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz12))
                tempB.Verwendungszweck(12) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz13))
                tempB.Verwendungszweck(13) = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_vwz14))
                tempB.KategorieId = CInt(Utils.DbNull2Nothing(dt.Rows(i)!b_kategorie))
                tempB.VertragId = CInt(Utils.DbNull2Nothing(dt.Rows(i)!b_vertrag))
                tempB.Bemerkung = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_bemerkung))
                tempB.ImportFile = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_importfile))

                lob.Add(tempB)
            Next

            Return lob
        End Function

        Public Overrides Function GetBuchungenForVertragList(ByVal vertragId As Integer) As List(Of Buchung)
            Dim lob As New List(Of Buchung)
            Dim cmd As DbCommand = _dataService.Factory.CreateCommand()
            Dim dt As DataTable

            cmd.CommandText = String.Format("SELECT * FROM {0} WHERE b_vertrag = @p_vertrag ORDER BY b_buchungsdatum", TAB_BUCHUNGEN)

            cmd.Parameters.Add(_dataService.CreateParameter("p_vertrag", DbType.Int32, vertragId))

            dt = _dataService.GetDataTable(cmd)

            For i As Integer = 0 To dt.Rows.Count - 1 Step 1
                Dim tempB As New Buchung
                tempB.Buchungsdatum = CDate(Utils.DbNull2Nothing(dt.Rows(i)!b_buchungsdatum))
                tempB.Id = CInt(Utils.DbNull2Nothing(dt.Rows(i)!b_id))
                tempB.Status = CStr(Utils.DbNull2Nothing(dt.Rows(0)!b_status))
                tempB.Betrag = CDbl(Utils.DbNull2Nothing(dt.Rows(i)!b_betrag))
                tempB.Bemerkung = CStr(Utils.DbNull2Nothing(dt.Rows(i)!b_bemerkung))
                lob.Add(tempB)
            Next

            Return lob

        End Function

        Public Overrides Sub DeleteBuchung(ByVal buchungId As Integer)
            KUeLib.Data.ServiceManager.GetInstance().GetFileAttachmentDataService().DeleteProcess(buchungId)
            KUeLib.Data.ServiceManager.GetInstance().GetBuchungspositionenDataService.DeletePositionen(buchungId)

            Dim cmd As DbCommand = _dataService.Factory.CreateCommand()
            Dim sb As New Text.StringBuilder

            sb.AppendLine("DELETE FROM buchungen WHERE b_id = @p_id ")
            cmd.CommandText = sb.ToString()
            cmd.Parameters.Add(_dataService.CreateParameter("p_id", DbType.Int32, buchungId))

            _dataService.ExecuteNonQuery(cmd)
        End Sub

    End Class

End Namespace